]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
Handle changes in window position for workspace thumbnails
authorOwen W. Taylor <otaylor@fishsoup.net>
Thu, 3 Feb 2011 03:54:33 +0000 (22:54 -0500)
committerOwen W. Taylor <otaylor@fishsoup.net>
Wed, 9 Feb 2011 00:43:21 +0000 (19:43 -0500)
Connect to the 'position-set' signal of MetaWindowActor and move
actors when the source windows move.

https://bugzilla.gnome.org/show_bug.cgi?id=640996

js/ui/workspaceThumbnail.js

index e4bd6bbff06d29c4ab149e58c46d8eaa595e6795..7e46a2860ba6720ce6cb87ce6ef20ce25eb1b13b 100644 (file)
@@ -21,13 +21,17 @@ function WindowClone(realWindow) {
 WindowClone.prototype = {
     _init : function(realWindow) {
         this.actor = new Clutter.Clone({ source: realWindow.get_texture(),
-                                         reactive: true,
-                                         x: realWindow.x,
-                                         y: realWindow.y });
+                                         reactive: true });
         this.actor._delegate = this;
         this.realWindow = realWindow;
         this.metaWindow = realWindow.meta_window;
 
+        this._positionChangedId = this.realWindow.connect('position-changed',
+                                                          Lang.bind(this, this._onPositionChanged));
+        this._realWindowDestroyedId = this.realWindow.connect('destroy',
+                                                              Lang.bind(this, this._disconnectRealWindowSignals));
+        this._onPositionChanged();
+
         this.actor.connect('button-release-event',
                            Lang.bind(this, this._onButtonRelease));
 
@@ -56,7 +60,26 @@ WindowClone.prototype = {
         this.actor.destroy();
     },
 
+    _onPositionChanged: function() {
+        let rect = this.metaWindow.get_outer_rect();
+        this.actor.set_position(this.realWindow.x, this.realWindow.y);
+    },
+
+    _disconnectRealWindowSignals: function() {
+        if (this._positionChangedId != 0) {
+            this.realWindow.disconnect(this._positionChangedId);
+            this._positionChangedId = 0;
+        }
+
+        if (this._realWindowDestroyedId != 0) {
+            this.realWindow.disconnect(this._realWindowDestroyedId);
+            this._realWindowDestroyedId = 0;
+        }
+    },
+
     _onDestroy: function() {
+        this._disconnectRealWindowSignals();
+
         this.actor._delegate = null;
 
         if (this.inDrag) {